From 97d1d358afb6cc1604747d4e4ead1d5da1a8adbb Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Sat, 28 Jun 2014 19:24:15 +1000 Subject: [PATCH] Generalise `find_project` to not always search parents. Also, add a helper around `find_project` that returns `dir/file` rather than just `dir`. --- src/bin/cargo-build.rs | 5 ++--- src/bin/cargo-test.rs | 5 ++--- src/bin/cargo.rs | 2 +- src/cargo/util/important_paths.rs | 35 +++++++++++++++++++++++++++---- 4 files changed, 36 insertions(+), 11 deletions(-) mode change 100644 => 100755 src/bin/cargo-build.rs mode change 100644 => 100755 src/bin/cargo-test.rs mode change 100644 => 100755 src/bin/cargo.rs diff --git a/src/bin/cargo-build.rs b/src/bin/cargo-build.rs old mode 100644 new mode 100755 index c3d3c96fe..f88cf5405 --- a/src/bin/cargo-build.rs +++ b/src/bin/cargo-build.rs @@ -16,7 +16,7 @@ use cargo::{execute_main_without_stdin}; use cargo::ops; use cargo::core::MultiShell; use cargo::util::{CliResult, CliError}; -use cargo::util::important_paths::find_project; +use cargo::util::important_paths::find_project_manifest; #[deriving(PartialEq,Clone,Decodable,Encodable)] pub struct Options { @@ -37,8 +37,7 @@ fn execute(options: Options, shell: &mut MultiShell) -> CliResult> { let root = match options.manifest_path { Some(path) => Path::new(path), - None => try!(find_project(os::getcwd(), "Cargo.toml") - .map(|path| path.join("Cargo.toml")) + None => try!(find_project_manifest(&os::getcwd(), "Cargo.toml") .map_err(|_| { CliError::new("Could not find Cargo.toml in this \ directory or any parent directory", diff --git a/src/bin/cargo-test.rs b/src/bin/cargo-test.rs old mode 100644 new mode 100755 index 8849b2d72..5adb71120 --- a/src/bin/cargo-test.rs +++ b/src/bin/cargo-test.rs @@ -16,7 +16,7 @@ use cargo::{execute_main_without_stdin}; use cargo::core::{MultiShell}; use cargo::util; use cargo::util::{CliResult, CliError}; -use cargo::util::important_paths::find_project; +use cargo::util::important_paths::find_project_manifest; #[deriving(PartialEq,Clone,Decodable)] struct Options { @@ -33,8 +33,7 @@ fn main() { fn execute(options: Options, shell: &mut MultiShell) -> CliResult> { let root = match options.manifest_path { Some(path) => Path::new(path), - None => try!(find_project(os::getcwd(), "Cargo.toml") - .map(|path| path.join("Cargo.toml")) + None => try!(find_project_manifest(&os::getcwd(), "Cargo.toml") .map_err(|_| { CliError::new("Could not find Cargo.toml in this \ directory or any parent directory", diff --git a/src/bin/cargo.rs b/src/bin/cargo.rs old mode 100644 new mode 100755 index 454e84e6b..ed3a12d32 --- a/src/bin/cargo.rs +++ b/src/bin/cargo.rs @@ -142,7 +142,7 @@ fn config_list(args: ConfigListFlags, _: &mut MultiShell) -> CliResult CliResult> { - let root = try!(find_project(os::getcwd(), "Cargo.toml").map_err(|e| { + let root = try!(find_project(&os::getcwd(), "Cargo.toml").map_err(|e| { CliError::from_boxed(e, 1) })); diff --git a/src/cargo/util/important_paths.rs b/src/cargo/util/important_paths.rs index 7bcc9a551..df7a6bd7a 100644 --- a/src/cargo/util/important_paths.rs +++ b/src/cargo/util/important_paths.rs @@ -1,15 +1,42 @@ use util::{CargoResult, human}; -pub fn find_project(pwd: Path, file: &str) -> CargoResult { +/// Iteratively search for `file` in `pwd` and its parents, returning +/// the path of the directory. +pub fn find_project(pwd: &Path, file: &str) -> CargoResult { + find_project_manifest(pwd, file) + .map(|mut p| { + // remove the file, leaving just the directory + p.pop(); + p + }) +} + +/// Iteratively search for `file` in `pwd` and its parents, returning +/// the path to the file. +pub fn find_project_manifest(pwd: &Path, file: &str) -> CargoResult { let mut current = pwd.clone(); loop { - if current.join(file.clone()).exists() { - return Ok(current) + let manifest = current.join(file); + if manifest.exists() { + return Ok(manifest) } if !current.pop() { break; } } - Err(human(format!("no manifest found in `{}`", pwd.display()))) + Err(human(format!("Could not find `{}` in `{}` or any parent directory", + file, pwd.display()))) +} + +/// Return the path to the `file` in `pwd`, if it exists. +pub fn find_project_manifest_exact(pwd: &Path, file: &str) -> CargoResult { + let manifest = pwd.join(file); + + if manifest.exists() { + Ok(manifest) + } else { + Err(human(format!("Could not find `{}` in `{}`", + file, pwd.display()))) + } } -- 2.30.2